home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / misc / amag / 12b92.lha / Tips & Tricks / Dezimalstrings (Assembler) / Str2Long.asm next >
Assembly Source File  |  1992-11-02  |  2KB  |  53 lines

  1.          lea.l   String(pc),a0 ; Beispiel
  2.          bsr.s   Str2Long
  3.          rts
  4. String   DC.B    "1000000",0
  5.  
  6. ; ==                   Str2Long                   ==
  7. ; == Eingabe: A0 - Zeiger auf den  String mit der ==
  8. ; ==               positiven, ganzen Zahl.        ==
  9. ; == Ausgabe: D0 - Zahl als Longword (sofern kein ==
  10. ; ==               kein Fehler auftrat)           ==
  11. ; ==          D1 - enthält  0  bei   fehlerfreier ==
  12. ; ==               Durchführung,  1   bei   einem ==
  13. ; ==               Fehler und 2,falls die Zahl zu ==
  14. ; ==               groß ist.                      ==
  15. ; ==          A0 - zeigt  bei fehlerfreier Durch- ==
  16. ; ==               führung auf das  erste Zeichen ==
  17. ; ==               nach der Zahl                  ==
  18. ; == VORSICHT: Register D2 wird verwendet !       ==
  19.  
  20. Str2Long move.b  (a0)+,d0 ; erstes Zeichen
  21.          sub.b   #"0",d0  ; von ASCII-Code in Ziffer umwandeln
  22.          cmp.b   #9,d0    ; größer als 9 ?
  23.          bhi.s   Error    ; erstes Zeichen ist keine Ziffer !
  24.          moveq.l #0,d1    ; alle Bits in D1 löschen
  25.  
  26. Loop     move.b  (a0)+,d1 ; nächste Ziffer
  27.          sub.b   #"0",d1  ; von ASCII-Code in Ziffer umwandeln
  28.          cmp.b   #9,d1    ; größer als 9 ?
  29.          bhi.s   End      ; Zeichen gehört nicht mehr zu Zahl
  30.  
  31.          add.l   d0,d0    ; Inhalt von D0 mit 10 multiplizieren:
  32.          bcs.s   Overflow ; 10*D0 = 2^2*2*D0 + 2*D0
  33.          move.l  d0,d2
  34.          add.l   d2,d2
  35.          bcs.s   Overflow ; Der MULU-Befehl kann nicht angewandt
  36.          add.l   d2,d2    ; werden, da dieser nur 16-Bit-Zahlen
  37.          bcs.s   Overflow ; multipliziert.
  38.          add.l   d2,d0
  39.          bcs.s   Overflow
  40.     
  41.          add.l   d1,d0    ; Ziffer addieren
  42.          bcc.s   Loop     ; Falls kein Overflow, gehe zu 'Loop'
  43.  
  44. Overflow moveq.l #2,d1    ; Zahl ist zu groß !
  45.          rts
  46.     
  47. End      subq.l  #1,a0    ; A0 zeigt das nächste Zeichen nach der Zahl
  48.          moveq.l #0,d1    ; es trat kein Fehler auf
  49.      rts
  50.  
  51. Error    moveq.l #1,d1    ; Fehler !
  52.      rts
  53.